package fr.efrei.paumier.common.time;

import java.time.Clock;
import java.time.Instant;

import fr.efrei.paumier.common.time.Event;
import fr.efrei.paumier.common.time.GameEngineAndQueue;

public class GameEngineAndQueueIP implements GameEngineAndQueue {
	private EventQueueIP events;

	//j initialise la liste dans le moteur a l heure actuel
	public GameEngineAndQueueIP(Clock horloge) {
		super();
		for (int i = 0; i < events.getEvents().size(); i++) {
			this.events.getEvents().get(i).setHorloge(horloge);
		}
	}
	
	@Override
	public void update() {
		for (int i = 0; i < events.getEvents().size(); i++) {
			if(this.getCurrentInstant().equals(Clock.systemUTC().instant())
					|| this.getCurrentInstant().isBefore(Clock.systemUTC().instant())) {
				if (this.getCurrentInstant().equals(
						events.getEvents().get(i).getTrigger().instant())) {
					// si le temps courant est parmi la liste parcourue
					events.getEvents().get(i).setTrigger(Clock.systemUTC());
					events.getEvents().get(i).getEvent().trigger();// on declenche
					events.getEvents().removeFirst();// on supprime
				}
			} else {
				events.getEvents().get(i).setHorloge(Clock.systemUTC());
				break;
			}
		}
	}

	@Override
	//envoie date declenchement
	public Instant getCurrentInstant() {
		return events.getEvents().getFirst().getTrigger().instant();
	}

	@Override
	public void register(Event... event) {
		if (event.length == 0)
			events.getEvents().add(null);
		for (int i = 0; i < event.length; i++) {
			events.getEvents().add(new RegisterEvent(event[i]));
		}
	}

}
